/**
 * i18n 工具函数
 * 处理语言检测、持久化和切换逻辑
 */

import { SUPPORTED_LANGUAGES, DEFAULT_LANGUAGE, isRTLLanguage } from './config/languages'

// 支持的语言列表（从配置文件导入）
export const SUPPORTED_LOCALES = SUPPORTED_LANGUAGES.map(lang => ({
  code: lang.code,
  name: lang.nativeName,
  browserCode: getBrowserCodes(lang.code)
}))

// 获取浏览器语言代码映射
function getBrowserCodes(code: string): string[] {
  const mappings: Record<string, string[]> = {
    'zh-CN': ['zh', 'zh-CN', 'zh-Hans'],
    'en-US': ['en', 'en-US'],
    'ar-SA': ['ar', 'ar-SA', 'ar-EG', 'ar-AE', 'ar-KW', 'ar-QA'],
    'ja-JP': ['ja', 'ja-JP'],
    'ko-KR': ['ko', 'ko-KR']
  }
  return mappings[code] || [code]
}

// 默认语言
export const DEFAULT_LOCALE = DEFAULT_LANGUAGE

// 本地存储键名
const LANGUAGE_STORAGE_KEY = 'preferred-language'

/**
 * 获取浏览器语言
 * @returns 浏览器语言代码
 */
export function getBrowserLanguage(): string {
  if (typeof window === 'undefined') return DEFAULT_LOCALE
  
  const browserLang = navigator.language || (navigator as any).userLanguage || DEFAULT_LOCALE
  
  // 检查是否支持该语言
  for (const locale of SUPPORTED_LOCALES) {
    if ((locale.browserCode as readonly string[]).includes(browserLang)) {
      return locale.code
    }
  }
  
  // 检查语言前缀（如 zh-CN 匹配 zh）
  const langPrefix = browserLang.split('-')[0]
  for (const locale of SUPPORTED_LOCALES) {
    if (locale.browserCode.some(code => code.startsWith(langPrefix))) {
      return locale.code
    }
  }
  
  return DEFAULT_LOCALE
}

/**
 * 从本地存储获取用户偏好的语言
 * @returns 用户偏好的语言代码
 */
export function getStoredLanguage(): string | null {
  if (typeof window === 'undefined') return null
  
  try {
    return localStorage.getItem(LANGUAGE_STORAGE_KEY)
  } catch (error) {
    console.warn('无法访问 localStorage:', error)
    return null
  }
}

/**
 * 保存用户偏好的语言到本地存储
 * @param locale 语言代码
 */
export function setStoredLanguage(locale: string): void {
  if (typeof window === 'undefined') return
  
  try {
    localStorage.setItem(LANGUAGE_STORAGE_KEY, locale)
  } catch (error) {
    console.warn('无法保存到 localStorage:', error)
  }
}

/**
 * 清除语言偏好设置
 */
export function clearStoredLanguage(): void {
  if (typeof window === 'undefined') return
  
  try {
    localStorage.removeItem(LANGUAGE_STORAGE_KEY)
  } catch (error) {
    console.warn('无法清除 localStorage:', error)
  }
}

/**
 * 获取初始语言
 * 优先级：用户存储的偏好 > 浏览器语言 > 默认语言
 * @returns 初始语言代码
 */
export function getInitialLanguage(): string {
  // 1. 检查用户存储的偏好
  const storedLanguage = getStoredLanguage()
  if (storedLanguage && SUPPORTED_LOCALES.some(locale => locale.code === storedLanguage)) {
    return storedLanguage
  }
  
  // 2. 检查浏览器语言
  const browserLanguage = getBrowserLanguage()
  if (browserLanguage && browserLanguage !== DEFAULT_LOCALE) {
    return browserLanguage
  }
  
  // 3. 返回默认语言
  return DEFAULT_LOCALE
}

/**
 * 验证语言代码是否有效
 * @param locale 语言代码
 * @returns 是否有效
 */
export function isValidLocale(locale: string): boolean {
  return SUPPORTED_LOCALES.some(l => l.code === locale)
}

/**
 * 根据语言代码获取语言信息
 * @param locale 语言代码
 * @returns 语言信息对象
 */
export function getLocaleInfo(locale: string) {
  return SUPPORTED_LOCALES.find(l => l.code === locale) || SUPPORTED_LOCALES[0]
}

/**
 * 语言切换处理函数
 * @param i18nInstance i18n 实例
 * @param newLocale 新语言代码
 * @param saveToStorage 是否保存到本地存储
 */
export function switchLanguage(
  i18nInstance: any, 
  newLocale: string, 
  saveToStorage: boolean = true
): void {
  if (!isValidLocale(newLocale)) {
    console.warn(`不支持的语言代码: ${newLocale}`)
    return
  }
  
  // 切换语言
  i18nInstance.locale.value = newLocale
  
  // 设置页面方向
  setPageDirection(newLocale)
  
  // 保存到本地存储
  if (saveToStorage) {
    setStoredLanguage(newLocale)
  }
  
  console.log('语言已切换到:', newLocale)
}

/**
 * 设置页面方向（RTL/LTR）
 * @param locale 语言代码
 */
export function setPageDirection(locale: string): void {
  if (typeof document === 'undefined') return
  
  const isRTL = isRTLLanguage(locale)
  const htmlElement = document.documentElement
  
  if (isRTL) {
    htmlElement.setAttribute('dir', 'rtl')
    htmlElement.setAttribute('lang', locale)
  } else {
    htmlElement.setAttribute('dir', 'ltr')
    htmlElement.setAttribute('lang', locale)
  }
  
  // 添加语言相关的CSS类
  htmlElement.className = htmlElement.className.replace(/\blang-\w+(-\w+)?\b/g, '')
  htmlElement.classList.add(`lang-${locale}`)
  
  console.log(`页面方向已设置为: ${isRTL ? 'RTL' : 'LTR'} (${locale})`)
}

/**
 * 获取当前页面方向
 * @returns 'rtl' | 'ltr'
 */
export function getCurrentDirection(): 'rtl' | 'ltr' {
  if (typeof document === 'undefined') return 'ltr'
  
  return document.documentElement.getAttribute('dir') as 'rtl' | 'ltr' || 'ltr'
}

/**
 * 检查当前是否为RTL模式
 * @returns boolean
 */
export function isCurrentlyRTL(): boolean {
  return getCurrentDirection() === 'rtl'
}

/**
 * 初始化语言系统
 * @param i18nInstance i18n 实例
 * @param forceLocale 强制设置的语言（可选）
 */
export function initializeLanguage(i18nInstance: any, forceLocale?: string): void {
  const targetLocale = forceLocale || getInitialLanguage()
  
  if (isValidLocale(targetLocale)) {
    switchLanguage(i18nInstance, targetLocale, !forceLocale)
    setPageDirection(targetLocale)
  } else {
    console.warn(`无效的语言代码: ${targetLocale}，使用默认语言`)
    switchLanguage(i18nInstance, DEFAULT_LOCALE, false)
    setPageDirection(DEFAULT_LOCALE)
  }
}
